home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr50 / ppldoc.zip / PPL.DOC
Text File  |  1993-05-03  |  48KB  |  1,397 lines

  1. | A vertical bar denotes changes since the last posting of the file.
  2. |
  3. | Current Posting Dated:  05-03-93
  4.  
  5.  PCBoard Programming Language
  6.  Version 1.00
  7.  ----------------------------
  8.  
  9.  
  10.  PPL SOURCE SYNTAX
  11.  
  12.      Each line of a PPL source file may contain none, one, some or all
  13.      of the following sections:
  14.  
  15.      [KEYWORD ][EXPR|VAR][,EXPR|VAR][;|'][COMMENT TEXT]
  16.  
  17.      KEYWORD - A PPL statement used to accomplish some task.
  18.      EXPR    - A PPL expressioin which may contain VARs, CONSTs,
  19.                and/or FUNCs.
  20.      VAR     - A PPL variable with optional array subscript.
  21.      CONST   - A PPL constant.
  22.      FUNC    - A PPL function that returns a value.
  23.      ;       - Used to start a comment.  Ignored by the compiler.
  24.      '       - Used to start a comment.  Ignored by the compiler.
  25.      COMMENT - Comment text following the ; or '.
  26.                Ignored by the compiler.
  27.  
  28.      If a line is blank or contains only a comment, it is skipped.
  29.      If it contains a KEYWORD, that line is compiled into a tokenized
  30.      format.
  31.      If it doesn't contain a KEYWORD but some argument, it is assumed to
  32.      be an assignement statement (LET).
  33.  
  34.  
  35.  DATA TYPES
  36.  
  37.      PPL utilizes the following data types:
  38.  
  39.      BOOLEAN
  40.          unsigned character (1 byte)
  41.          0 = FALSE, non-0 = TRUE
  42.  
  43.      DATE
  44.          unsigned integer (2 bytes)
  45.          PCBoard julian date (count of days since 1/1/1900)
  46.  
  47.      INTEGER
  48.          signed long integer (4 bytes)
  49.          -2,147,483,648 - +2,147,483,647
  50.  
  51.      MONEY
  52.          signed long integer (4 bytes)
  53.          -$21,474,836.48 - +$21,474,836.47
  54.  
  55.      STRING
  56.          far character pointer (4 bytes)
  57.          NULL is an empty string; non-NULL points to a string of some
  58.          length less than or equal to 256
  59.  
  60.      TIME
  61.          signed long integer (4 bytes)
  62.          Count of seconds since midnight
  63.  
  64.      SYNTAX
  65.          TYPE var[(dim[,dim[,dim]])][,var...]
  66.  
  67.      NOTES:  Any type may be assigned to any other type.  This is the
  68.              simplest way to accomplish type conversion.  BOOLEAN, DATE,
  69.              INTEGER, MONEY and TIME are all integer types and may be
  70.              assigned to each other. Assignment from a larger data type
  71.              to a smaller data type automatically converts the data to a
  72.              format suitable for the smaller data type.  Conversion to
  73.              and from STRINGs is dependent on the other data type.
  74.              DATEs are imported/exported as "MM-DD-YY". TIMEs are
  75.              imported/exported as "HH:MM:SS".  MONEYs are imported/
  76.              exported as "#.##" without embedded dollar signs or commas,
  77.              and using as many characters as needed to the left of the
  78.              decimal point.  All variables must be declared before use.
  79.  
  80.  
  81.  CONSTANTS
  82.  
  83.      PPL allows user defined constants in the following formats:
  84.  
  85.      $#.## - A MONEY constant (dollar sign followed by optional dollars
  86.              followed by decimal point followed by cents; # = 0-9)
  87.      #h    - An INTEGER hexadecimal constant (# = 0-9 & A-F)
  88.      #d    - An INTEGER decimal constant (# = 0-9)
  89.      #o    - An INTEGER octal constant (# = 0-7)
  90.      #b    - An INTEGER binary constant (# = 0-1)
  91.      #     - An INTEGER constant (# = 0-9)
  92.      "X"   - A STRING constant (X = any displayable text)
  93.      @X##  - An INTEGER @X constant (# = 0-9 & A-F)
  94.  
  95.      The following predefined constant labels are also defined:
  96.  
  97.      AUTO = 2000h
  98.          Parameter passed to INPUTSTR and PROMPTSTR statements
  99.          (automatically press enter after 10 seconds of no user input)
  100.  
  101.      BELL = 800h
  102.          Parameter passed to DISPTEXT statement
  103.          (sound a bell when prompt displayed)
  104.  
  105.      DEFS = 0
  106.          Parameter passed to various statements for default values
  107.  
  108.      ECHODOTS = 1h
  109.          Parameter passed to INPUTSTR and PROMPTSTR statements
  110.          (echo dots instead of user input)
  111.  
  112.      ERASELINE = 20h
  113.          Parameter passed to INPUTSTR and PROMPTSTR statements
  114.          (erase the current line when user presses enter)
  115.  
  116.      FALSE = 0
  117.          BOOLEAN FALSE value
  118.  
  119.      FCL = 2
  120.          Value passed to STARTDISP to force line counting display
  121.  
  122.      FIELDLEN = 2h
  123.          Parameter passed to INPUTSTR and PROMPTSTR statements (displays
  124.          parenthesis to show input field width if ANSI enabled)
  125.  
  126.      FNS = 1
  127.          Value passed to STARTDISP to force non-stop display
  128.  
  129.      F_EXP = 2h
  130.          Expired subscription access allowed flag for CONFFLAG and
  131.          CONFUNFLAG
  132.  
  133.      F_MW = 10h
  134.          Mail waiting flag for CONFFLAG and CONFUNFLAG
  135.  
  136.      F_REG = 1h
  137.          Registered access allowed flag for CONFFLAG and CONFUNFLAG
  138.  
  139.      F_SEL = 4h
  140.          Conference selected flag for CONFFLAG and CONFUNFLAG
  141.  
  142.      F_SYS = 8h
  143.          Conference SysOp access flag for CONFFLAG and CONFUNFLAG
  144.  
  145.      GRAPH = 1h
  146.          Parameter passed to DISPFILE statement to search for graphics
  147.          specific files
  148.  
  149.      GUIDE = 4h
  150.          Parameter passed to INPUTSTR and PROMPTSTR statements
  151.          (displays parenthesis above current line if FIELDLEN used and
  152.          ANSI not enabled)
  153.  
  154.      HIGHASCII = 1000h
  155.          Parameter passed to INPUTSTR and PROMPTSTR statements
  156.          (allow high ascii characters, regardless of current valid
  157.          character set, if disable high ascii filter set to yes)
  158.  
  159.      LANG = 4h
  160.          Parameter passed to DISPFILE statement to search for language
  161.          specific files
  162.  
  163.      LFAFTER = 100h
  164.          Parameter passed to INPUTSTR, PROMPTSTR and DISPTEXT statements
  165.          (send an extra line feed after user presses enter)
  166.  
  167.      LFBEFORE = 80h
  168.          Parameter passed to INPUTSTR, PROMPTSTR and DISPTEXT statements
  169.          (send an extra line feed before prompt display)
  170.  
  171.      LOGIT = 8000h
  172.          Parameter passed to DISPTEXT statement
  173.          (log text to callers log)
  174.  
  175.      LOGITLEFT = 10000h
  176.          Parameter passed to DISPTEXT statement
  177.          (log text to callers log, forcing left justification)
  178.  
  179.      NC = 0
  180.          Value passed to STARTDISP to not change display mode
  181.  
  182.      NEWLINE = 40h
  183.          Parameter passed to INPUTSTR, PROMPTSTR and DISPTEXT statements
  184.          (send a line feed after user presses enter)
  185.  
  186.      NOCLEAR = 400h
  187.          Parameter passed to INPUTSTR and PROMPTSTR statements
  188.          (don't clear field at first keypress regardless of ANSI)
  189.  
  190.      O_RD = 0
  191.          Parameter passed to FCREATE/FOPEN/FAPPEND to open a file in
  192.          read only mode
  193.  
  194.      O_RW = 2
  195.          Parameter passed to FCREATE/FOPEN/FAPPEND to open a file in
  196.          read and write mode
  197.  
  198.      O_WR = 1
  199.          Parameter passed to FCREATE/FOPEN/FAPPEND to open a file in
  200.          write only mode
  201.  
  202.      SEC = 2h
  203.          Parameter passed to DISPFILE statement to search for security
  204.          specific files
  205.  
  206.      STACKED = 10h
  207.          Parameter passed to INPUTSTR and PROMPTSTR statements
  208.          (allow semi-colons and spaces in addition to valid character
  209.          set passed)
  210.  
  211.      S_DB = 3h
  212.          Parameter passed to FCREATE/FOPEN/FAPPEND to deny read and
  213.          write (both) access from other processes
  214.  
  215.      S_DN = 0h
  216.          Parameter passed to FCREATE/FOPEN/FAPPEND to allow read and
  217.          write (deny none) access from other processes
  218.  
  219.      S_DR = 1h
  220.          Parameter passed to FCREATE/FOPEN/FAPPEND to deny read access
  221.          from other processes
  222.  
  223.      S_DW = 2h
  224.          Parameter passed to FCREATE/FOPEN/FAPPEND to deny write access
  225.          from other processes
  226.  
  227.      TRUE = 1
  228.          BOOLEAN TRUE value
  229.  
  230.      UPCASE = 8h
  231.          Parameter passed to INPUTSTR and PROMPTSTR statements
  232.          (force user input to upper case)
  233.  
  234.      WORDWRAP = 200h
  235.          Parameter passed to INPUTSTR and PROMPTSTR statements
  236.          (if user hits end of line, save the text at the end of the line
  237.          for future use)
  238.  
  239.      YESNO = 4000h
  240.          Parameter passed to INPUTSTR and PROMPTSTR statements
  241.          (Only allow international yes/no responses)
  242.  
  243.  
  244.  PREDEFINED VARIABLES
  245.  
  246.      PPL predefines the following variables for user record access:
  247.  
  248.      BOOLEAN U_CLS
  249.          Clear screen between messages status
  250.  
  251.      BOOLEAN U_DEF79
  252.          79 column message editor default
  253.  
  254.      BOOLEAN U_EXPERT
  255.          Users current expert status
  256.  
  257.      BOOLEAN U_FSE
  258.          Users full screen editor default
  259.  
  260.      BOOLEAN U_FSEP
  261.          Prompt for full screen editor status
  262.  
  263.      BOOLEAN U_LONGHDR
  264.          6 line vs 4 line message header status
  265.  
  266.      BOOLEAN U_SCROLL
  267.          Scroll multi-screen message status
  268.  
  269.      DATE U_EXPDATE
  270.          The users subscription expiration date
  271.  
  272.      DATE U_PWDEXP
  273.          The date that the users password expires and must be changed
  274.  
  275.      INTEGER U_EXPSEC
  276.          The users expired security level
  277.  
  278.      INTEGER U_PAGELEN
  279.          The users page length
  280.  
  281.      INTEGER U_SEC
  282.          The users security level
  283.  
  284.      STRING U_ADDR(5)
  285.          The users address information (if the SysOp has enabled address
  286.          recording)
  287.          Subscript 0 = First street line
  288.                    1 = Second street line
  289.                    2 = City
  290.                    3 = State
  291.                    4 = Zip
  292.                    5 = Country
  293.  
  294.      STRING U_ALIAS
  295.          The users alias (if the SysOp has enabled alias use)
  296.  
  297.      STRING U_BDPHONE
  298.          The users business/data phone number
  299.  
  300.      STRING U_CITY
  301.          The users city/state information
  302.  
  303.      STRING U_CMNT1
  304.          The users comment field
  305.  
  306.      STRING U_CMNT2
  307.          The SysOps comment field
  308.  
  309.      STRING U_HVPHONE
  310.          The users home/voice phone number
  311.  
  312.      STRING U_NOTES(4)
  313.          Notes about the user (if the SysOp has enabled the note
  314.          capability)
  315.          Subscripts 0-4 hold lines 1-5
  316.  
  317.      STRING U_PWD
  318.          The users password
  319.  
  320.      STRING U_TRANS
  321.          The users default transfer protocol
  322.  
  323.      STRING U_VER
  324.          The users verification string (if the SysOp has enabled user
  325.          verification)
  326.  
  327.  
  328.  EXPRESSION OPERATORS
  329.  
  330.      PPL allows the following operators to be used in expressions
  331.      (lvalue and rvalue are simply the values to the left and right,
  332.      respectively, of binary operators):
  333.  
  334.      (  - Start sub-expression (also allows [ or { to be used)
  335.      )  - End sub-expression (also allows ] or } to be used)
  336.      ^  - Raise lvalue to the power of rvalue
  337.      *  - Multiply lvalue by rvalue
  338.      /  - Divide lvalue by rvalue
  339.      %  - Remainder of lvalue divided by rvalue
  340.      +  - Add rvalue to lvalue
  341.      -  - Subtract rvalue from lvalue
  342.      =  - Is lvalue equal to rvalue (also allows ==)
  343.      <> - Is lvalue not equal to rvalue (also allows != and ><)
  344.      <  - Is lvalue less than rvalue
  345.      <= - Is lvalue less than or equal to rvalue (also allows =<)
  346.      >  - Is lvalue greater than rvalue
  347.      >= - Is lvalue greater than or equal to rvalue (also allows =>)
  348.      !  - Logical not of rvalue
  349.      &  - Logical and of lvalue with rvalue (also allows &&)
  350.      |  - Logical or of lvalue with rvalue (also allows ||)
  351.  
  352.  
  353.  FUNCTIONS
  354.  
  355.      PPL allows the following functions, returning the specified type,
  356.      with the specified arguments, to be used in an expression (some
  357.      functions require no arguments, in which case the parenthesis are
  358.      empty; if arguments are required, the arguments may all be
  359.      expressions of any type, but will be converted to one of the
  360.      following types prior to function evaluation:  BEXP (BOOLEAN),
  361.      DEXP (DATE), IEXP (INTEGER), MEXP (MONEY), SEXP (STRING),
  362.      TEXP (TIME)):
  363.  
  364.      ABORT() (BOOLEAN)
  365.          Returns a flag indicating whether or not the user aborted the
  366.          display of data via ^K/^X or answering no to a MORE? prompt
  367.  
  368.      ABS(IEXP) (INTEGER)
  369.          Returns the absolute value of IEXP
  370.  
  371.      AND(IEXP1,IEXP2) (INTEGER)
  372.          Returns the bitwise and of two integer expressions
  373.  
  374.      ANSION() (BOOLEAN)
  375.          Returns TRUE if the user has ANSI capabilities
  376.  
  377.      ASC(SEXP) (INTEGER)
  378.          Returns the ASCII value (0-255) of the first character of SEXP
  379.  
  380.      B2W(IEXP1,IEXP2) (INTEGER)
  381.          Returns a word built from two byte sized values by the formula:
  382.          (IEXP1*0100h+IEXP2)
  383.  
  384.      CALLID() (STRING)
  385.          Returns the caller ID string
  386.  
  387.      CALLNUM() (INTEGER)
  388.          Returns the caller number of the current user.
  389.  
  390.      CARRIER() (INTEGER)
  391.          Returns the carrier speed as reported by the modem to PCBoard
  392.  
  393.      CCTYPE(SEXP) (STRING)
  394.          Returns the issuer of credit card number SEXP
  395.  
  396.      CDON() (BOOLEAN)
  397.          Returns TRUE if the carrier detect signal is on
  398.  
  399.      CHR(IEXP) (STRING)
  400.          Returns a single character long string of the character
  401.          represented by ASCII code IEXP (0-255)
  402.  
  403.      CURCOLOR() (INTEGER)
  404.          Returns the current color (0-255) in use by the ANSI driver
  405.  
  406.      CURCONF() (INTEGER)
  407.          Returns the current conference number
  408.  
  409.      CURSEC() (INTEGER)
  410.          Returns the users current security level
  411.  
  412.      DATE() (DATE)
  413.          Returns todays date
  414.  
  415.      DAY(DEXP) (INTEGER)
  416.          Returns the day of the month (1-31) of DEXP
  417.  
  418.      DBGLEVEL() (INTEGER)
  419.          Returns the debug level in effect
  420.  
  421.      DEFCOLOR() (INTEGER)
  422.          Returns the default color as specified in PCBSetup
  423.  
  424.      DOW(DEXP) (INTEGER)
  425.          Returns the day of the week (0 = Sunday, 6 = Saturday) that
  426.          DEXP fell on
  427.  
  428.      EXIST(SEXP) (BOOLEAN)
  429.          Returns a boolean TRUE value if the file SEXP exists
  430.  
  431.      FERR(IEXP) (BOOLEAN)
  432.          Returns TRUE if a file access error occurred on channel IEXP
  433.          since the file was opened or FERR was last called
  434.  
  435.      FILEINF(SEXP,IEXP) (BOOLEAN, DATE, INTEGER, STRING and TIME)
  436.          Returns a piece of information (specified by IEXP) about the
  437.          file SEXP
  438.          Valid values for IEXP:  1 = Return TRUE if file exists
  439.                                  2 = Return file date stamp
  440.                                  3 = Return file time stamp
  441.                                  4 = Return file size
  442.                                  5 = Return file attributes
  443.                                      01h = Read Only
  444.                                      02h = Hidden
  445.                                      04h = System
  446.                                      20h = Archive
  447.                                  6 = Return file drive
  448.                                  7 = Return file path
  449.                                  8 = Return file base name
  450.                                  9 = Return file extension
  451.  
  452.      FMTCC(SEXP) (STRING)
  453.          Returns a formatted credit card number based on SEXP
  454.  
  455.      GETENV(SEXP) (STRING)
  456.          Returns the value of the environment variable named by SEXP
  457.  
  458.      GETTOKEN() (STRING)
  459.          Returns the next string token from a prior call to TOKENIZE
  460.          (Same as the GETTOKEN statement but can be used in an
  461.          expression without prior assignement to a variable)
  462.  
  463.      GETX() (INTEGER)
  464.          Returns the current column (X position) of the cursor on the
  465.          display
  466.  
  467.      GETY() (INTEGER)
  468.          Returns the current row (Y position) of the cursor on the
  469.          display
  470.  
  471.      GRAFMODE() (STRING)
  472.          Returns a character indicating the users graphics status
  473.          R = RIPscrip supported, G = ANSI graphics (color and
  474.          positioning) supported, A = ANSI positioning (no color)
  475.          supported, or N = No graphics (RIP or ANSI) supported
  476.  
  477.      HELPPATH() (STRING)
  478.          Returns the path, as specified in PCBSetup, to the help files
  479.  
  480.      HOUR(TEXP) (INTEGER)
  481.          Returns the hour of the day (0-23) of TEXP
  482.  
  483.      I2S(IEXP1,IEXP2) (STRING)
  484.          Returns a string representing the integer value IEXP1 converted
  485.          to base IEXP2
  486.  
  487.      INKEY() (STRING)
  488.          Returns the next keypress as a single character long string, or
  489.          a string with the name of the function or cursor control key
  490.  
  491.      INSTR(SEXP1,SEXP2) (INTEGER)
  492.          Returns the position of SEXP2 in SEXP1 (1-LEN(SEXP1)) or 0 if
  493.          SEXP2 not in SEXP1
  494.  
  495.      KINKEY() (STRING)
  496.          Returns the next keypress from the BBS keyboard as a single
  497.          character long string, or a string with the name of the
  498.          function or cursor control key
  499.  
  500.      LANGEXT() (STRING)
  501.          Returns the file extension for the users language selection
  502.  
  503.      LEFT(SEXP,IEXP) (STRING)
  504.          Returns the left-most IEXP characters of SEXP
  505.  
  506.      LEN(SEXP) (INTEGER)
  507.          Returns the length of SEXP
  508.  
  509.      LOGGEDON() (BOOLEAN)
  510.          Returns TRUE if the user has already logged on to the BBS,
  511.          FALSE otherwise
  512.  
  513.      LOWER(SEXP) (STRING)
  514.          Returns a string of SEXP with all uppercase characters
  515.          converted to lowercase characters
  516.  
  517.      LTRIM(SEXP1,SEXP2) (STRING)
  518.          Returns a string of SEXP1 with the first character of SEXP2
  519.          trimmed from the left
  520.  
  521.      MASK_ALNUM() (STRING)
  522.          Returns a valid character mask for input statements of
  523.          A through Z, a through z, and 0 through 9
  524.  
  525.      MASK_ALPHA() (STRING)
  526.          Returns a valid character mask for input statements of
  527.          A through Z and a through z
  528.  
  529.      MASK_ASCII() (STRING)
  530.          Returns a valid character mask for input statements of
  531.          space (" ") through tilde ("~")
  532.  
  533.      MASK_FILE() (STRING)
  534.          Returns a valid character mask for input statements of
  535.          file names
  536.  
  537.      MASK_NUM() (STRING)
  538.          Returns a valid character mask for input statements of
  539.          0 through 9
  540.  
  541.      MASK_PATH() (STRING)
  542.          Returns a valid character mask for input statements of
  543.          path names
  544.  
  545.      MASK_PWD() (STRING)
  546.          Returns a valid character mask for input statements of
  547.          passwords
  548.  
  549.      MAXNODE() (INTEGER)
  550.          Returns the maximum node possible with the current software
  551.          (ie, /2 would return 2, /10 would return 10, etc)
  552.  
  553.      MGETBYTE() (INTEGER)
  554.          Returns the value of the next byte from the modem (0-255) or -1
  555.          if there are no bytes waiting for input
  556.  
  557.      MID(SEXP,IEXP1,IEXP2) (STRING)
  558.          Returns a string from SEXP starting at the IEXP1 position of
  559.          SEXP and containing IEXP2 characters of SEXP
  560.  
  561.      MIN(TEXP) (INTEGER)
  562.          Returns the minute of the hour (0-59) of TEXP
  563.  
  564.      MINKEY() (STRING)
  565.          Returns the next keypress from the remote caller as a single
  566.          character long string, or a string with the name of the
  567.          function or cursor control key
  568.  
  569.      MINLEFT() (INTEGER)
  570.          Returns the current callers minutes left to use online
  571.  
  572.      MINON() (INTEGER)
  573.          Returns the current callers minutes online so far this session
  574.  
  575.      MKADDR(IEXP1,IEXP2) (INTEGER)
  576.          Returns a segment:offset address as a long integer built from
  577.          two word sized values by the formula: (IEXP1*00010000h+IEXP2)
  578.  
  579.      MKDATE(IEXP1,IEXP2,IEXP3) (DATE)
  580.          Returns a date with the year specified by IEXP1 (1900-2079),
  581.          month specified by IEXP2 (1-12), and day specified by IEXP3
  582.          (1-31).
  583.  
  584.      MODEM() (STRING)
  585.          Returns the modem connect string as reported by the modem to
  586.          PCBoard
  587.  
  588.      MONTH(DEXP) (INTEGER)
  589.          Returns the month of the year (1-12) of DEXP
  590.  
  591.      NOCHAR() (STRING)
  592.          Returns the current language no character
  593.  
  594.      NOT(IEXP) (INTEGER)
  595.          Returns the bitwise complement (all bits inverted) of an
  596.          integer expression
  597.  
  598.      ONLOCAL() (BOOLEAN)
  599.          Returns TRUE if the user is on locally
  600.  
  601.      OR(IEXP1,IEXP2) (INTEGER)
  602.          Returns the bitwise or of two integer expressions
  603.  
  604. |    PAGESTAT() (BOOLEAN)
  605. |        Returns TRUE if the user has paged the SysOp (or PAGEON has
  606. |        been issued), FALSE otherwise (or PAGEOFF has been issued)
  607.  
  608.      PCBDAT() (STRING)
  609.          Returns a string with the path and file name of PCBOARD.DAT
  610.  
  611.      PCBNODE() (INTEGER)
  612.          Returns the node number
  613.  
  614.      PEEKB(IEXP) (INTEGER)
  615.          Returns a byte value (0-255) located at memory address IEXP
  616.          (PEEK is a synonym)
  617.  
  618.      PEEKDW(IEXP) (INTEGER)
  619.          Returns a signed integer value (-2147483648 - +2147483647)
  620.          located at memory address IEXP
  621.  
  622.      PEEKW(IEXP) (INTEGER)
  623.          Returns a word value (0-65535) located at memory address IEXP
  624.  
  625.      PPENAME() (STRING)
  626.          Returns the name of the currently executing PPE file minus the
  627.          path and extension
  628.  
  629.      PPEPATH() (STRING)
  630.          Returns a string with the path (no file name) of the currently
  631.          executing PPE file
  632.  
  633.      PSA(IEXP) (BOOLEAN)
  634.          Returns TRUE if the feature specified by IEXP is enabled,
  635.          FALSE if the feature specified by IEXP is disabled
  636.          Valid values for IEXP:  1 = Alias Support Enabled
  637.                                  2 = Verify Support Enabled
  638.                                  3 = Address Support Enabled
  639.                                  4 = Password Support Enabled
  640.                                  5 = Statistics Support Enabled
  641.                                  6 = Notes Support Enabled
  642.  
  643.      RANDOM(IEXP) (INTEGER)
  644.          Returns a random number between 0 and IEXP inclusive
  645.  
  646.      READLINE(SEXP,IEXP) (STRING)
  647.          Read and return line number IEXP from file SEXP
  648.  
  649.      REGAH() (INTEGER)
  650.          Returns the value of the AH register after a DOINTR statement
  651.  
  652.      REGAL() (INTEGER)
  653.          Returns the value of the AL register after a DOINTR statement
  654.  
  655.      REGAX() (INTEGER)
  656.          Returns the value of the AX register after a DOINTR statement
  657.  
  658.      REGBH() (INTEGER)
  659.          Returns the value of the BH register after a DOINTR statement
  660.  
  661.      REGBL() (INTEGER)
  662.          Returns the value of the BL register after a DOINTR statement
  663.  
  664.      REGBX() (INTEGER)
  665.          Returns the value of the BX register after a DOINTR statement
  666.  
  667.      REGCF() (BOOLEAN)
  668.          Returns the state of the carry flag after a DOINTR statement
  669.  
  670.      REGCH() (INTEGER)
  671.          Returns the value of the CH register after a DOINTR statement
  672.  
  673.      REGCL() (INTEGER)
  674.          Returns the value of the CL register after a DOINTR statement
  675.  
  676.      REGCX() (INTEGER)
  677.          Returns the value of the CX register after a DOINTR statement
  678.  
  679.      REGDH() (INTEGER)
  680.          Returns the value of the DH register after a DOINTR statement
  681.  
  682.      REGDI() (INTEGER)
  683.          Returns the value of the DI register after a DOINTR statement
  684.  
  685.      REGDL() (INTEGER)
  686.          Returns the value of the DL register after a DOINTR statement
  687.  
  688.      REGDS() (INTEGER)
  689.          Returns the value of the DS register after a DOINTR statement
  690.  
  691.      REGDX() (INTEGER)
  692.          Returns the value of the DX register after a DOINTR statement
  693.  
  694.      REGES() (INTEGER)
  695.          Returns the value of the ES register after a DOINTR statement
  696.  
  697.      REGF() (INTEGER)
  698.          Returns the value of the flags register after a DOINTR
  699.          statement
  700.  
  701.      REGSI() (INTEGER)
  702.          Returns the value of the SI register after a DOINTR statement
  703.  
  704.      REPLACE(SEXP1,SEXP2,SEXP3) (STRING)
  705.          Returns a string of SEXP1 with all occurences of the first
  706.          character of SEXP2 replaced by the first character of SEXP3
  707.  
  708.      RIGHT(SEXP,IEXP) (STRING)
  709.          Returns the right-most IEXP characters of SEXP
  710.  
  711.      RTRIM(SEXP1,SEXP2) (STRING)
  712.          Returns a string of SEXP1 with the first character of SEXP2
  713.          trimmed from the right
  714.  
  715.      S2I(SEXP,IEXP) (INTEGER)
  716.          Returns an integer representing the string SEXP converted from
  717.          base IEXP
  718.  
  719. |    SCRTEXT(IEXP1,IEXP2,IEXP3,BEXP) (STRING)
  720. |        Returns a string with the text (and color information in the
  721. |        form of @X codes if BEXP is TRUE) from column IEXP1, row IEXP2,
  722. |        and of length IEXP3
  723.  
  724.      SEC(TEXP) (INTEGER)
  725.          Returns the second of the minute (0-59) of TEXP
  726.  
  727. |    SHOWSTAT() (BOOLEAN)
  728. |        Returns TRUE if writing to the display is active, FALSE if
  729. |        writing to the display is disabled
  730.  
  731.      SLPATH() (STRING)
  732.          Returns the path, as specified in PCBSetup, to the login
  733.          security files
  734.  
  735.      SPACE(IEXP) (STRING)
  736.          Returns a string of spaces IEXP characters long
  737.  
  738.      STRING(EXP) (STRING)
  739.          Returns EXP converted to a string
  740.  
  741.      STRIP(SEXP1,SEXP2) (STRING)
  742.          Returns a string of SEXP1 with all occurrences of the first
  743.          character of SEXP2 removed
  744.  
  745.      STRIPATX(SEXP) (STRING)
  746.          Returns a string of SEXP with all @X codes removed
  747.  
  748.      SYSOPSEC() (INTEGER)
  749.          Returns the SysOp security defined in PCBOARD.DAT
  750.  
  751.      TEMPPATH() (STRING)
  752.          Returns the path, as specified in PCBSetup, to the temporary
  753.          work directory
  754.  
  755.      TIME() (TIME)
  756.          Returns the current time
  757.  
  758.      TIMEAP(TEXP) (STRING)
  759.          Returns a string representing the time TEXP in civilian format
  760.          (XX:XX:XX AM)
  761.  
  762.      TOKCOUNT() (INTEGER)
  763.          Returns the number of tokens available via the GETTOKEN
  764.          statement and/or function
  765.  
  766.      TOKENSTR() (STRING)
  767.          Returns a previously tokenized string reconstructed with
  768.          semi-colons separating the component tokens
  769.  
  770.      TRIM(SEXP1,SEXP2) (STRING)
  771.          Returns a string of SEXP1 with the first character of SEXP2
  772.          trimmed from both ends
  773.  
  774.      UPPER(SEXP) (STRING)
  775.          Returns a string of SEXP with all lowercase characters
  776.          converted to uppercase characters
  777.  
  778.      UN_CITY() (STRING)
  779.          Returns a nodes city from USERNET.XXX after a RDUNET statement
  780.  
  781.      UN_NAME() (STRING)
  782.          Returns a nodes user name from USERNET.XXX after a RDUNET
  783.          statement
  784.  
  785.      UN_OPER() (STRING)
  786.          Returns a nodes operation text from USERNET.XXX after a RDUNET
  787.          statement
  788.  
  789.      UN_STAT() (STRING)
  790.          Returns a nodes status from USERNET.XXX after a RDUNET
  791.          statement
  792.  
  793.      U_BDL() (INTEGER)
  794.          Returns the current users number of bytes downloaded
  795.  
  796.      U_BDLDAY() (INTEGER)
  797.          Returns the current users number of bytes downloaded today
  798.  
  799.      U_BUL() (INTEGER)
  800.          Returns the current users number of bytes uploaded
  801.  
  802.      U_FDL() (INTEGER)
  803.          Returns the current users number of files downloaded
  804.  
  805.      U_FUL() (INTEGER)
  806.          Returns the current users number of files uploaded
  807.  
  808.      U_INCONF(IEXP1,IEXP2) (BOOLEAN)
  809.          Returns TRUE if user record number IEXP2 is registered in
  810.          conference IEXP1
  811.  
  812.      U_LDATE() (DATE)
  813.          Returns the current users last date on the system
  814.  
  815.      U_LDIR() (DATE)
  816.          Returns the current users last directory scan date
  817.  
  818.      U_LOGONS() (INTEGER)
  819.          Returns the current users number of times logged on
  820.  
  821.      U_LTIME() (TIME)
  822.          Returns the current users last time on the system
  823.  
  824.      U_MSGRD() (INTEGER)
  825.          Returns the number of messages the user has read
  826.  
  827.      U_MSGWR() (INTEGER)
  828.          Returns the number of messages the user has written
  829.  
  830.      U_NAME() (STRING)
  831.          Returns the current users name
  832.  
  833.      U_PWDHIST(IEXP) (STRING)
  834.          Returns the specified password from the password history
  835.          Valid values for IEXP are 1 through 3
  836.  
  837.      U_PWDLC() (DATE)
  838.          Returns the date of the last password change
  839.  
  840.      U_PWDTC() (INTEGER)
  841.          Returns the number of times the password has been changed
  842.  
  843.      U_RECNUM(SEXP) (INTEGER)
  844.          Returns the user record number (0-65535) for user name SEXP or
  845.          -1 if SEXP is not registered on this system.
  846.  
  847.      U_STAT(IEXP) (DATE or INTEGER)
  848.          Returns a statistic about the user that is tracked by PCBoard
  849.          Valid values for IEXP are 1 through 15
  850.             1 - Returns the first date the user called the system
  851.             2 - Returns the number of SysOp pages the user has requested
  852.             3 - Returns the number of group chats the user has
  853.                 participated in
  854.             4 - Returns the number of comments the user has left
  855.             5 - Returns the number of 300 bps connects
  856.             6 - Returns the number of 1200 bps connects
  857.             7 - Returns the bumber of 2400 bps connects
  858.             8 - Returns the number of 9600 bps connects
  859.             9 - Returns the number of 14400 bps connects
  860.            10 - Returns the number of security violations
  861.            11 - Returns the number of "not registered in conference"
  862.                 warnings
  863.            12 - Returns the number of times the users download limit
  864.                 has been reached
  865.            13 - Returns the number of "file not found" warnings
  866.            14 - Returns the number of password errors the user has had
  867.            15 - Returns the number of verify errors the user has had
  868.  
  869.      U_TIMEON() (INTEGER)
  870.          Returns the current users time online today in minutes
  871.  
  872.      VALCC(SEXP) (BOOLEAN)
  873.          Returns TRUE if SEXP is a valid credit card number
  874.  
  875.      VALDATE(SEXP) (BOOLEAN)
  876.          Returns TRUE if SEXP is in a valid date format
  877.  
  878.      VALTIME(SEXP) (BOOLEAN)
  879.          Returns TRUE if SEXP is in a valid time format
  880.  
  881.      VER() (INTEGER)
  882.          Returns the version number of PCBoard that is running
  883.  
  884.      XOR(IEXP1,IEXP2) (INTEGER)
  885.          Returns the bitwise exclusive-or of two integer expressions
  886.  
  887.      YEAR(DEXP) (INTEGER)
  888.          Returns the year (1900-2079) of DEXP
  889.  
  890.      YESCHAR() (STRING)
  891.          Returns the current language yes character
  892.  
  893.  
  894.  STATEMENTS
  895.  
  896.      PPL recognizes the following statements with the specified
  897.      arguments to perform the specified operations (some statements
  898.      require no arguments, in which case there is nothing following the
  899.      statement; if arguments are required, they may be of two types,
  900.      expression and variable; expression arguments may all be
  901.      expressions of any type, but will be converted to one of the
  902.      following types prior to function evaluation:  BEXP (BOOLEAN),
  903.      DEXP (DATE), IEXP (INTEGER), MEXP (MONEY), SEXP (STRING), TEXP
  904.      (TIME); variable arguments (VAR) may be variables of any type, but
  905.      may be converted to and from an appropriate type in order to
  906.      accomplish the required statement):
  907.  
  908.      ADJTIME IEXP
  909.          Add or subtract IEXP minutes to the users time available this
  910.          session
  911.  
  912.      ANSIPOS IEXP1,IEXP2
  913.          If ANSI is available, position the cursor in
  914.          column IEXP1 row IEXP2
  915.          Legal ranges:  1 <= IEXP1 <= 80
  916.                         1 <= IEXP2 <= 23 (Because of the status lines)
  917.                         (1,1) is the top left corner of the screen
  918.  
  919.      BACKUP IEXP
  920.          Backup (move the cursor to the left) IEXP columns without going
  921.          past column 1
  922.  
  923.      BLT IEXP
  924.          Display bulletin number IEXP
  925.  
  926.      BROADCAST IEXP1,IEXP2,SEXP
  927.          Broadcast message SEXP to nodes from IEXP1 to IEXP2 inclusive
  928.  
  929.      BYE
  930.          Same as having the user type BYE from the command prompt
  931.  
  932.      CALL SEXP
  933.          Load and execute PPE filename specified by SEXP
  934.  
  935.      CDCHKOFF
  936.          Turn off carrier detect checking
  937.  
  938.      CDCHKON
  939.          Turn on carrier detect checking
  940.  
  941.      CHAT
  942.          Initiate SysOp chat mode
  943.  
  944.      CLOSECAP
  945.          Close the capture file previously opened with OPENCAP
  946.  
  947.      CLREOL
  948.          Clear to the end of the line, with the current color if in ANSI
  949.          mode
  950.  
  951.      CLS
  952.          Clear the screen, with the current color if in ANSI mode
  953.  
  954.      COLOR IEXP
  955.          Change the current color to IEXP
  956.  
  957.      CONFFLAG IEXP1,IEXP2
  958.          Turn on the conference IEXP1 flags specified by IEXP2
  959.  
  960.      CONFUNFLAG IEXP1,IEXP2
  961.          Turn off the conference IEXP1 flags specified by IEXP2
  962.  
  963.      DBGLEVEL IEXP
  964.          Set the debug level to IEXP
  965.  
  966.      DEC VAR
  967.          Decrement the value of VAR
  968.  
  969.      DEFCOLOR
  970.          Resets the current color to the system default
  971.  
  972.      DELAY IEXP
  973.          Pause for IEXP clock ticks
  974.          (1 clock tick = approximately 1/18.2 second)
  975.  
  976.      DELETE SEXP
  977.          Deletes the filename specified by SEXP (ERASE is a synonym)
  978.  
  979.      DELUSER
  980.          Flags the current user record for deletion
  981.  
  982.      DIR SEXP
  983.          Performs a file directory command, passing it SEXP as arguments
  984.  
  985.      DISPFILE SEXP,IEXP
  986.          Display file SEXP with IEXP alternate file flags
  987.          (valid flags = GRAPH, SEC, LANG)
  988.  
  989.      DISPSTR SEXP
  990.          Display file if SEXP is "%filename", execute PPE if SEXP is
  991.          "!filename", or display string SEXP
  992.  
  993.      DISPTEXT IEXP1,IEXP2
  994.          Display PCBTEXT prompt IEXP1 using flags IEXP2
  995.          (valid flags = NEWLINE, LFBEFORE, LFAFTER, BELL, LOGIT,
  996.          LOGITLEFT)
  997.  
  998.      DOINTR IEXP1,IEXP2,IEXP3,IEXP4,IEXP5,IEXP6,IEXP7,IEXP8,IEXP9,IEXP10
  999.          Generate interrupt number IEXP1 (0-255) with the following
  1000.          register values:
  1001.              AX    = IEXP2
  1002.              BX    = IEXP3
  1003.              CX    = IEXP4
  1004.              DX    = IEXP5
  1005.              SI    = IEXP6
  1006.              DI    = IEXP7
  1007.              FLAGS = IEXP8
  1008.              DS    = IEXP9
  1009.              ES    = IEXP10
  1010.  
  1011.      DTROFF
  1012.          Turn off the DTR signal
  1013.  
  1014.      DTRON
  1015.          Turn on the DTR signal
  1016.  
  1017.      END
  1018.          End PPE execution
  1019.  
  1020.      FAPPEND IEXP1,SEXP,IEXP2,IEXP3
  1021.          Use channel IEXP1 to open file SEXP in append mode with access
  1022.          mode IEXP2 and share mode IEXP3
  1023.          (valid channels = 0 - 7 [0 is used for script questionnaires])
  1024.          (valid access modes = O_RD, O_WR, O_RW [should use O_RW])
  1025.          (valid share modes = S_DN, S_DR, S_DW, S_DB)
  1026.  
  1027.      FCLOSE IEXP
  1028.          Close channel IEXP
  1029.  
  1030.      FCREATE IEXP1,SEXP,IEXP2,IEXP3
  1031.          Use channel IEXP1 to create and open file SEXP in access mode
  1032.          IEXP2 and share mode IEXP3
  1033.          (valid channels = 0 - 7 [0 is used for script questionnaires])
  1034.          (valid access modes = O_RD, O_WR, O_RW [should use O_WR])
  1035.          (valid share modes = S_DN, S_DR, S_DW, S_DB)
  1036.  
  1037.      FGET IEXP,VAR
  1038.          Read a line from channel IEXP and assign it to VAR
  1039.  
  1040.      FOPEN IEXP1,SEXP,IEXP2,IEXP3
  1041.          Use channel IEXP1 to open file SEXP in access mode IEXP2 and
  1042.          share mode IEXP3
  1043.          (valid channels = 0 - 7 [0 is used for script questionnaires])
  1044.          (valid access modes = O_RD, O_WR, O_RW)
  1045.          (valid share modes = S_DN, S_DR, S_DW, S_DB)
  1046.  
  1047.      FOR VAR = IEXP1 TO IEXP2 [STEP IEXP3]
  1048.        statement(s)
  1049.      NEXT
  1050.          FOR - Initializes a loop by assigning IEXP1 to VAR and
  1051.            continuing while VAR <= IEXP2 (if IEXP3 >= 0) or VAR >= IEXP2
  1052.            (if IEXP3 < 0) (TO is required to separate IEXP1 and IEXP2;
  1053.            if STEP (optional) is not specified IEXP3 defaults to 1)
  1054.          NEXT - Adds IEXP3 to VAR, transfers control to the closest FOR
  1055.            statement, and marks the end of the FOR loop (ENDFOR and END
  1056.            FOR are synonyms)
  1057.  
  1058.      FORWARD IEXP
  1059.          Move the cursor forward (to the right) IEXP columns without
  1060.          going past column 80
  1061.  
  1062.      FPUT IEXP,SEXP[,SEXP...]
  1063.          Write one or more SEXP out to channel IEXP
  1064.  
  1065.      FPUTLN IEXP[,SEXP[,SEXP...]]
  1066.          Write zero or more SEXP out to channel IEXP and terminate with
  1067.          a carriage return/line feed pair
  1068.  
  1069.      FPUTPAD IEXP1,SEXP,IEXP2
  1070.          Write out SEXP, padding or truncating to length IEXP2 as
  1071.          needed, to channel IEXP1
  1072.  
  1073.      FRESHLINE
  1074.          If the cursor is not in column 1, do a newline
  1075.  
  1076.      FREWIND IEXP
  1077.          Rewind channel IEXP after flushing buffers and committing the
  1078.          file to disk.
  1079.  
  1080.      GETTOKEN VAR
  1081.          Get a token from a previous call to tokenize and assign
  1082.          it to VAR
  1083.  
  1084.      GETUSER
  1085.          Fill the predefined variables (U_...) with current information
  1086.          from the user record
  1087.  
  1088.      GOSUB LABEL
  1089.          Transfer control to LABEL, marking the current PPE location for
  1090.          a future RETURN statement (GO SUB is a synonym)
  1091.  
  1092.      GOTO LABEL
  1093.          Transfer control to LABEL (GO TO is a synonym)
  1094.  
  1095.      GOODBYE
  1096.          Same as having the user type G from the command prompt
  1097.  
  1098.      HANGUP
  1099.          Hangup on the user without any notification
  1100.  
  1101.      IF (BEXP) statement ...
  1102.          Evaluate BEXP and, if true, execute statement; otherwise skip
  1103.          to the next statement
  1104.  
  1105.      IF (BEXP) THEN
  1106.        statement(s)
  1107.      ELSEIF (BEXP) THEN
  1108.        statement(s)
  1109.      ELSE
  1110.        statement(s)
  1111.      ENDIF
  1112.          IF - If expression cond is TRUE then this statement transfers
  1113.            control to the statement(s) following it, otherwise control
  1114.            is tranferred to the next ELSEIF, ELSE or ENDIF statement
  1115.            (requires THEN [or DO] after the condition)
  1116.          ELSEIF - (optional) If expression cond is TRUE then this
  1117.            statement transfers control to the statements following it,
  1118.            otherwise control is tranferred to the next ELSEIF, ELSE or
  1119.            ENDIF statement (There may be multiple ELSEIF statements
  1120.            between the IF and ELSE statements (ELSE IF is a synonym;
  1121.            nothing is required to come after the condition, although
  1122.            THEN [or DO] may appear for clarification and consistency in
  1123.            the source code)
  1124.          ELSE - (optional) Separates the false portion of an IF/ELSEIF
  1125.            statement from the true portion
  1126.          ENDIF - Ends an IF/ELSEIF/ELSE statement block (END IF is a
  1127.            synonym)
  1128.  
  1129.      INC VAR
  1130.          Increment the value of VAR
  1131.  
  1132.      INPUT SEXP,VAR
  1133.          Display SEXP and get input from user, assigning it to VAR
  1134.          (60 characters maximum)
  1135.  
  1136.      INPUTCC SEXP,VAR,IEXP
  1137.          Display SEXP in color IEXP and get a credit card formatted
  1138.          string from the user, assigning it to VAR
  1139.          (16 characters maximum, valid characters 0-9)
  1140.  
  1141.      INPUTDATE SEXP,VAR,IEXP
  1142.          Display SEXP in color IEXP and get a date formatted string from
  1143.          the user, assigning it to VAR
  1144.          (8 characters maximum, valid characters 0-9 - /)
  1145.  
  1146.      INPUTINT SEXP,VAR,IEXP
  1147.          Display SEXP in color IEXP and get an integer formatted string
  1148.          from the user, assigning it to VAR
  1149.          (11 characters maximum, valid characters 0-9)
  1150.  
  1151.      INPUTMONEY SEXP,VAR,IEXP
  1152.          Display SEXP in color IEXP and get a money formatted string
  1153.          from the user, assigning it to VAR
  1154.          (13 characters maximum, valid characters 0-9 $ .)
  1155.  
  1156.      INPUTSTR SEXP1,VAR,IEXP1,IEXP2,SEXP2,IEXP3
  1157.          Display SEXP1 in color IEXP1 and get a string (maximum length
  1158.          IEXP2, valid characters SEXP2, flags IEXP3) from the user,
  1159.          assigning it to VAR
  1160.          (valid length = 1-256)
  1161.          (valid characters = any string)
  1162.          (valid flags = ECHODOTS, FIELDLEN, GUIDE, UPCASE, STACKED,
  1163.          ERASELINE, NEWLINE, LFBEFORE, LFAFTER, WORDWRAP, NOCLEAR,
  1164.          HIGHASCII, AUTO, YESNO)
  1165.  
  1166.      INPUTTEXT SEXP,VAR,IEXP1,IEXP2
  1167.          Display SEXP in color IEXP1 and get a string (maximum length
  1168.          IEXP2) from the user, assigning it to VAR
  1169.  
  1170.      INPUTTIME SEXP,VAR,IEXP
  1171.          Display SEXP in color IEXP and get a time formatted string from
  1172.          the user, assigning it to VAR
  1173.          (8 characters maximum, valid characters 0-9 :)
  1174.  
  1175.      INPUTYN SEXP,VAR,IEXP
  1176.          Display SEXP in color IEXP and get a yes/no response from
  1177.          the user, assigning it to VAR
  1178.          (1 characters maximum, valid characters determined by language)
  1179.  
  1180.      JOIN SEXP
  1181.          Performs a join conference command, passing it SEXP as
  1182.          arguments
  1183.  
  1184.      KBDCHKOFF
  1185.          Turn off keyboard time out checking
  1186.  
  1187.      KBDCHKON
  1188.          Turn on keyboard time out checking
  1189.  
  1190.      KBDFILE SEXP
  1191.          Stuff the keyboard buffer with the contents of file SEXP
  1192.  
  1193.      KBDSTUFF SEXP
  1194.          Stuff the keyboard buffer with the contents of SEXP
  1195.  
  1196.      LET VAR = EXP
  1197.          Evaluate expression EXP, convert and assign to VAR
  1198.          (NOTE:  LET is the only optional keyword.  If no keyword is
  1199.          found, LET is assumed.  There are certain circumstances where
  1200.          it may be required, such as assignment to a variable named the
  1201.          same as a statement (PRINT, for example, would require a line
  1202.          such as LET PRINT = TRUE instead of just PRINT = TRUE)
  1203.  
  1204.      LOG SEXP,BEXP
  1205.          Write string SEXP to the callers log, left justified if BEXP is
  1206.          TRUE
  1207.  
  1208.      MESSAGE IEXP,SEXP1,SEXP2,SEXP3,SEXP4,DEXP,BEXP1,BEXP2,SEXP5
  1209.          Write a message in conference IEXP, to user SEXP1 (empty string
  1210.          defaults to current caller), from user SEXP2 (empty string
  1211.          defaults to current caller), subject SEXP3, security in SEXP4
  1212.          (N or R; N is the default), pack out date in DEXP (0 for no
  1213.          pack out date), BEXP1 TRUE if return receipt desired, BEXP2
  1214.          TRUE if message should be echoed, and SEXP5 is the filename to
  1215.          use for the message text
  1216.  
  1217.      MORE
  1218.          Displays a MORE? prompt
  1219.  
  1220.      MPRINT SEXP[,SEXP...]
  1221.          Display one or more string expressions on the callers screen
  1222.          only (this statement does not send anything to the BBS screen)
  1223.  
  1224.      MPRINTLN [SEXP[,SEXP...]]
  1225.          Display zero or more string expressions on the callers screen
  1226.          only and follow with a newline (this statement does not send
  1227.          anything to the BBS screen)
  1228.  
  1229.      NEWLINE
  1230.          Write a newline to the display
  1231.  
  1232.      NEWLINES IEXP
  1233.          Write IEXP newlines to the display
  1234.  
  1235.      OPENCAP SEXP,VAR
  1236.          Open SEXP and capture all screen output to it.  If an error
  1237.          occurs creating or opening SEXP, VAR is set to TRUE, otherwise
  1238.          VAR is set to FALSE.
  1239.  
  1240.      OPTEXT SEXP
  1241.          Writes string SEXP into the @OPTEXT@ macro
  1242.  
  1243. |    PAGEOFF
  1244. |        Turn off the SysOp paged indicator (flashing p on status line)
  1245. |
  1246. |    PAGEON
  1247. |        Turn on the SysOp paged indicator (flashing p on status line)
  1248.  
  1249.      POKEB IEXP1,IEXP2
  1250.          Assign the value IEXP2 (0-255) to memory address IEXP1
  1251.          (POKE is a synonym)
  1252.  
  1253.      POKEDW IEXP1,IEXP2
  1254.          Assign the value IEXP2 (-2147483648 - +2147483647) to memory
  1255.          address IEXP1
  1256.  
  1257.      POKEW IEXP1,IEXP2
  1258.          Assign the value IEXP2 (0-65535) to memory address IEXP1
  1259.  
  1260.      POP VAR[,VAR...]
  1261.          Pop values (previously pushed onto the stack) into a list of
  1262.          variables
  1263.  
  1264.      PRINT SEXP[,SEXP...]
  1265.          Display one or more string expressions
  1266.  
  1267.      PRINTLN [SEXP[,SEXP...]]
  1268.          Display zero or more string expressions and follow with a
  1269.          newline
  1270.  
  1271.      PROMPTSTR IEXP1,VAR,IEXP2,SEXP,IEXP3
  1272.          Display PCBTEXT entry IEXP1 and get a string (maximum length
  1273.          IEXP2, valid characters SEXP, flags IEXP3) from the user,
  1274.          assigning it to VAR
  1275.          (valid length = 1-256)
  1276.          (valid characters = any string)
  1277.          (valid flags = ECHODOTS, FIELDLEN, GUIDE, UPCASE, STACKED,
  1278.          ERASELINE, NEWLINE, LFBEFORE, LFAFTER, WORDWRAP, NOCLEAR,
  1279.          HIGHASCII, AUTO, YESNO)
  1280.  
  1281.      PUSH EXP[,EXP...]
  1282.          Push a list of evaluated expressions onto the stack
  1283.  
  1284.      PUTUSER
  1285.          Write the information from the predefined variables (U_...) to
  1286.          the user record
  1287.  
  1288.      QUEST IEXP
  1289.          Do script questionnaire IEXP
  1290.  
  1291.      RDUNET IEXP
  1292.          Read information from USERNET.XXX for node IEXP
  1293.  
  1294.      RDUSYS
  1295.          Reads a USERS.SYS file, if present, and updates the users
  1296.          record
  1297.  
  1298.      RENAME SEXP1,SEXP2
  1299.          Rename file SEXP1 to SEXP2
  1300.  
  1301.      RESETDISP
  1302.          Reset the display after an user abort
  1303.  
  1304.      RESTSCRN
  1305.          Restore the screen from the buffer previously saved with
  1306.          SAVESCRN
  1307.  
  1308.      RETURN
  1309.          Return to the statement after the last GOSUB or, if no GOSUB is
  1310.          waiting for a RETURN, END the PPE
  1311.  
  1312.      SAVESCRN
  1313.          Save the current screen in a buffer for later restoration with
  1314.          the RESTSCRN
  1315.  
  1316.      SENDMODEM SEXP
  1317.          Send the text in SEXP out to the modem
  1318.  
  1319.      SHELL BEXP,VAR,SEXP1,SEXP2
  1320.          Shell (via COMMAND.COM if BEXP is TRUE) to program/command
  1321.          SEXP1 with arguments SEXP2, saving the return value in VAR
  1322.          (NOTE:  If BEXP is TRUE, the value assigned to VAR will be the
  1323.          return code of COMMAND.COM, not SEXP1)
  1324.  
  1325. |    SHOWOFF
  1326. |        Turns off display of information to the screen
  1327. |
  1328. |    SHOWON
  1329. |        Turns on display of information to the screen
  1330.  
  1331.      SOUND IEXP
  1332.          Turn on the BBS PC speaker at the frequency (1-65535) specified
  1333.          by IEXP (or turn it off if the frequency is 0)
  1334.  
  1335.      SPRINT SEXP[,SEXP...]
  1336.          Display one or more string expressions on the BBS screen only
  1337.          (this statement does not send anything to the modem)
  1338.  
  1339.      SPRINTLN [SEXP[,SEXP...]]
  1340.          Display zero or more string expressions on the BBS screen only
  1341.          and follow with a newline (this statement does not send
  1342.          anything to the modem)
  1343.  
  1344.      STARTDISP IEXP
  1345.          Start display monitoring in mode IEXP
  1346.          (valid modes = NC, FNS, FCL)
  1347.  
  1348.      STOP
  1349.          Abort PPE execution without appending answers (channel 0) to
  1350.          the answer file
  1351.  
  1352.      TOKENIZE SEXP
  1353.          Tokenize string SEXP into individual items separated by
  1354.          semi-colons or spaces
  1355.  
  1356.      VARADDR VAR1,VAR2
  1357.          Assign the address (segment and offset) of VAR1 to VAR2
  1358.  
  1359.      VAROFF VAR1,VAR2
  1360.          Assign the offset address of VAR1 to VAR2
  1361.  
  1362.      VARSEG VAR1,VAR2
  1363.          Assign the segment address of VAR1 to VAR2
  1364.  
  1365.      WAIT
  1366.          Displays a PRESS ENTER TO CONTINUE? prompt
  1367.  
  1368.      WAITFOR SEXP,VAR,IEXP
  1369.          Wait up to IEXP seconds for the string SEXP, assigned TRUE to
  1370.          VAR if the string is found in the time specified or FALSE if
  1371.          the string is not found (WAIT FOR is a synonym)
  1372.  
  1373.      WHILE (BEXP) statement ...
  1374.          While BEXP is true execute statement; when BEXP is false
  1375.          execute following statements
  1376.  
  1377.      WHILE (BEXP) DO
  1378.        statement(s)
  1379.      ENDWHILE
  1380.          WHILE - While BEXP is true execute statement(s); when BEXP is
  1381.            false transfer control to the first statement following the
  1382.            ENDWHILE statement (requires DO [or THEN] after the
  1383.            expression)
  1384.          ENDWHILE - Transfers control to the closest WHILE statement and
  1385.            marks the end of the WHILE loop (END WHILE is a synonym)
  1386.  
  1387.      WRUNET IEXP,SEXP1,SEXP2,SEXP3,SEXP4,SEXP5
  1388.          Write information to USERNET.XXX for node IEXP, where SEXP1 is
  1389.          the new node status, SEXP2 is the new node user name, SEXP3 is
  1390.          the new node city, SEXP4 is the new node operation text, and
  1391.          SEXP5 is broadcast text
  1392.  
  1393.      WRUSYS
  1394.          Writes (creates) a USERS.SYS file which can be used by a
  1395.          SHELLed application
  1396.  
  1397.